#define _CRT_SECURE_NO_WARNINGS 1


使用自己写的库的几种方法：
 1.直接拷贝到系统库中

 2.动态库进行软连接: ln -s 绝对路径 链接位置，链接后名称
sodu ln -s /home/whb/111/roommate/mylib/lib/libmyc.so	/lib64/libmyc.so

删除(解除)软连接
sudo unlink /lib64/libmyc.so

 3.命令行导入环境变量方式： (环境变量本身是一个内存级别的，重新启动的时候又要重新导入)
加载库路径： LD_LIBRARY_PATH
[a@192 DTK]$ LD_LIBRARY_PATH = $LD_LIBRARY_PATH:  /home/a/Desktop/a/bb/dir/DTK/mylib/lib

再次查看环境变量：
[a@192 DTK]$ echo $LD_LIBRARY_PATH
: / home / a / Desktop / a / bb / dir / DTK / mylib / lib

[a@192 DTK]$ ldd a.out
linux - vdso.so.1 = > (0x00007ffc5dd83000)
libmyc.so = > / home / a / Desktop / a / bb / dir / DTK / mylib / lib (环境变量的方式)
libc.so.6 = > / lib64 / libc.so.6 (0x00007f1066892000)
 lib64 / ld - linux - x86 - 64.so.2 (0x00007f1066c60000)


 4.永久生效，修改 .bashrc 配置文件：
[a@192 ~]$ cd ~			//返回家目录
[a@192 ~]$ ls - al		//展示隐藏文件
- rw - r--r--.  1 a    a      193 Mar 31  2020.bash_profile
- rw - r--r--.  1 a    a      231 Mar 31  2020.bashrc			//配置的环境变量
[a@192 ~]$ vim.bashrc		//打开当前环境变量配置文件

# .bashrc
	... ...
 alias vim='home/whb/.VimForCpp/nvim'
 添加我们的环境变量：路径
export LD_LIBRARY_PATH = $LD_LIBRARY_PATH: / home / a / Desktop / a / bb / dir / DTK / mylib / lib


[a@192 ~]$ source ~/ .bashrc			//来源：
[a@192 ~]$ echo $LD_LIBRARY_PATH		//查看来源：
	: / home / a / Desktop / a / bb / dir / DTK / mylib / lib


 5.root 账户下:系统级别的配置文件。
[a@192 ~]$ ls / etc / ld.so.conf.d	// 这文件中存在着许多，系统级别的配置文件。
bind - export - x86_64.conf  kernel - 3.10.0 - 1160.el7.x86_64.conf  mariadb - x86_64.conf
dyninst - x86_64.conf      libiscsi - x86_64.conf

	具体操作如下：
[a@192 ~]$ su -						//进入超级用户
Password:
[root@192 ~] # cd / etc / ld.so.conf.d
[root@192 ld.so.conf.d]# ll
total 20								//里面都是以 .conf 结尾
- rw - r--r--. 1 root root 26 Oct 13  2020 bind - export - x86_64.conf
- rw - r--r--. 1 root root 19 Aug  8  2019 dyninst - x86_64.conf
- r--r--r--. 1 root root 63 Oct 19  2020 kernel - 3.10.0 - 1160.el7.x86_64.conf
- rw - r--r--. 1 root root 17 Nov  5  2016 libiscsi - x86_64.conf
- rw - r--r--. 1 root root 17 Oct  1  2020 mariadb - x86_64.conf

创建 自己的配置文件并打开
[root@192 ld.so.conf.d]# touch 111.conf
total 20
- rw - r--r--. 1 root root  0 May 31 07:33 111.conf
[root@192 ld.so.conf.d]# vim 111.conf

内容就是配置文件的路径：【 /home/a/Desktop/a/bb/dir/DTK/mylib/lib 】

让所有配置文件生效：生效后才可以正常使用。
[root@192 ld.so.conf.d]# ldconfig			


——————————————————————————————————————————————————————————————————

		《 动态库 VS 静态库 》

	《 动态链接 》
[a@192 ~]$ gcc main.c -I mylib/include/ -L mylib/lib -lmyc
[a@192 DTK]$ ll
- rwxrwxr - x. 1 a a 【 16640 】 May 24 08:54 a.out

	《 静态链接 》      //容量差异非常大。
[a@192 ~]$ gcc main.c -I mylib/include/ -L mylib/lib -lmyc -static 
[a@192 DTK]$ ll
- rwxrwxr - x. 1 a a 【 862368 】 May 24 08:54 a.out

总结：
默认链接的是动态库，
如果你只提供了 .a(静态库)，但没有使用 -static,只能静态链接到当前的 .a(静态库)，其他库正常动态链接。
-static 的意义是什么呢？
程序强制执行 静态链接，但是要求我们必须提供，对应的静态库，否则报错。


——————————————————————————————————————————————————————————————————

		< 安装 ncurses 库 >	
 这是一个可自由配置的库，简单的黑屏窗口管理工具
[a@192 DTK]$ sudo yum install ncurses

——————————————————————————————————————————————————————————————————




		《 Linux_26_虚拟-物理地址映射关系 》


#include <stdio.h>

int Sum(int top)
{
    int i = 1;
    int ret = 0;
    for (i = 1; i <= top; i++)
    {
        ret += i;
    }
    return ret;
}

int main()
{
    int top = 100;
    int result = Sum(top);
    printf(result = "%d\n", result);

    return 0;
}


——————————————————————————————————————————————————

ELF格式的可执行程序，二进制是有自己的固定格式的。
elf可执行程序的头部，可执行程序的属性
可执行程序编译之后，
会变成很多行汇编语句，
每条汇编语句都有他的地址：
如何编址的呢 ?
00000.0000 ~FFF...FFFFFF

平坦模式(绝对编址)
【40052d】 : 55                   	push % rbp
逻辑地址(相对编址) = 函数入口地址 + 每一份数据对应的【偏移量】
逻辑地址 <==> 虚拟地址!

	《 反汇编 》
 objdump -S code
 objdump -S code > code.s		重定向到 code.s

[a@192 virtual_Address]$ pwd
 【code】文件所在路径：
 home/a/Desktop/a/d/virtual_Address

[a@192 virtual_Address]$ ll
- rwxrwxr - x. 1 a a 8424 Jun  1 08:39 code
- rw - rw - r--. 1 a a  228 Jun  1 08 : 39 code.c

反汇编:
[a@192 virtual_Address]$ objdump - S code

code : file format elf64 - x86 - 64
000000000040052d <Sum> :
[虚拟地址]  加载到内存后，与内存的[物理地址]构建映射关系，形成[页表]。
40052d : 55                   	push % rbp
40052e : 48 89 e5             	mov % rsp, % rbp
400531 : 89 7d ec             	mov % edi, -0x14(% rbp)
400534 : c7 45 fc 01 00 00 00 	movl   $0x1, -0x4(% rbp)
40053b : c7 45 f8 00 00 00 00 	movl   $0x0, -0x8(% rbp)
400542 : c7 45 fc 01 00 00 00 	movl   $0x1, -0x4(% rbp)
400549 : eb 0a                	jmp    400555 < Sum + 0x28 >
40054b : 8b 45 fc             	mov - 0x4(% rbp), % eax
40054e : 01 45 f8             	add % eax, -0x8(% rbp)
400551 : 83 45 fc 01          	addl   $0x1, -0x4(% rbp)
400555 : 8b 45 fc             	mov - 0x4(% rbp), % eax
400558 : 3b 45 ec             	cmp - 0x14(% rbp), % eax
40055b : 7e ee                	jle    40054b < Sum + 0x1e>
40055d : 8b 45 f8             	mov - 0x8(% rbp), % eax
400560 : 5d                   	pop % rbp
400561 : c3                   	retq

0000000000400562 < main > :
400562 : 55                   	push % rbp
400563 : 48 89 e5             	mov % rsp, % rbp
400566 : 48 83 ec 10          	sub    $0x10, % rsp
40056a : c7 45 fc 64 00 00 00 	movl   $0x64, -0x4(% rbp)
400571 : 8b 45 fc             	mov - 0x4(% rbp), % eax
400574 : 89 c7                	mov % eax, % edi
400576 : e8 b2 ff ff ff       	callq  40052d < Sum>
40057b : 89 45 f8             	mov % eax, -0x8(% rbp)
40057e : 8b 45 f8             	mov - 0x8(% rbp), % eax
400581 : 89 c6                	mov % eax, % esi
400583 : bf 30 06 40 00       	mov    $0x400630, % edi
400588 : b8 00 00 00 00       	mov    $0x0, % eax
40058d : e8 7e fe ff ff       	callq  400410 < printf@plt >
400592 : b8 00 00 00 00       	mov    $0x0, % eax
400597 : c9                   	leaveq
400598 : c3                   	retq
400599 : 0f 1f 80 00 00 00 00 	nopl   0x0(% rax)

1.进程创建阶段，初始化 地址空间，让CPU知道main函数入口地址
2.加载->每一行代码和数据，就都有了物理地址，
 自己的虚拟地址自己也知道，然后就可以构建映射了

地址种类
ELF + 加载器 :   (加载器：/lib64/ld-linux-x86-64.so.2 (0x00007fe7c1c6e000))
各个区域的起始和结束地址，main函数的入口地址

[a@192 virtual_Address]$ ldd code
linux - vdso.so.1 = > (0x00007ffc6bb78000)
libc.so.6 = > / lib64 / libc.so.6 (0x00007fe7c18a0000)
lib64/ld-linux-x86-64.so.2 (0x00007fe7c1c6e000)		//(加载器)


——————————————————————————————————————————————————


——————————————————————————————————————————————————















